#include <iostream>
#include "48castForClass.hpp"

int main(int argc, char const *argv[])
{
    // 因为StoneWeight对象表示一个重量,我们其实已经这样做了,在C++中,下面的构造函数将会将double类型的函数转换成StoneWeight类型
    // StoneWeight(double lbs);
    StoneWeight sw;
    sw = 19.2;          // 这里就用到了构造函数StoneWeight(double dl);

    // 如果这里有一个类似于这样的构造函数 StoneWeight(int l,double lbs = 1.0)     有默认构造参数
    // 那么它将对 sw = 2; 有效

    // 似乎使用上面的强制类型转换特性不错,但是有些时候这种强制类型转换不总是合乎需要的,因为这样会导致意外的类型转换
    // 因此C++新增的关键字 explicit 用于关闭这种隐式特性(显示没有限制)

    // 隐式: sw = 19.2;
    // 显式: StoneWeight sw = StoneWeight(19.2) 或者 (StoneWeight)19.2 [老式写法]

    // 应当声明成这样:
    // explicit StoneWeight(double lba);

    // explicit 意为: 显式的
    // 就像上面的sw = 19.2是隐式类型转换,如果声明中加上了explicit关键字,那么前面的语句将会无法调用而报错

    // 在类的声明中可以定义一个类型到另一个类型的[转换函数]
    // 转换函数
    // 注意: 在c++11以前, explicit关键字不会在转换函数中发挥作用!
    // 定义转换函数: operator int(); [格式: operator TypeName();]  没有返回值,也不需要返回值,同样的也没有参数

    // 这里可能会涉及到自动类型转换,比如下面这样的:
    //      定义了,且仅定义了 operator double();
    //      C++有可能会将 int类型自动转换成double类型,从而适用operator double() 类型转换

// 总结:
    // C++为类提供了两种强制类型转换
    // 1. 利用构造函数
    // 有定义 StoneWeight(int n);
    // StoneWeight sw;
    // sw = 19;          // 这里就用到了构造函数StoneWeight(int n);     隐式调用
    // StoneWeight(19)或者(StoneWeight)19       显示调用

    // 2.定义转换函数: operator int(); [格式: operator TypeName();]  没有返回值类型,没有参数. 
    // 其中typeName值对象将被转换成的类型
    // 将类或者对象付给typeName变量或者强制转换成typename类型是,这个函数将会自动被调用
    // 指定了类和类之间的强制类型转换

    

    return 0;
}
